package br.univali.programacao.carraid;
import java.awt.Graphics2D;
import java.awt.Rectangle;

/**
 *
 * @author Murilo
 */
public abstract class GameObject implements UpdateableObject {

    private double y;
    private double x;
    private double velocidade;
    private double angulo;
    private Sprite sprite;

    abstract public void draw(Graphics2D g);

    @Override
    public void update( long tempoDoFrame ) {
        double anguloEmRadianos = Math.toRadians(getAngulo());
        setX(getX() + getVelocidade() * tempoDoFrame / 1000. * Math.cos(anguloEmRadianos));
        setY(getY() + getVelocidade() * tempoDoFrame / 1000. * Math.sin(anguloEmRadianos));
        
        if( getSprite() != null ) {
            getSprite().update(tempoDoFrame);
        }
    }

    
    
    /**
     * @return the y
     */
    public double getY() {
        return y;
    }

    /**
     * @param y the y to set
     */
    public void setY(double y) {
        this.y = y;
    }

    /**
     * @return the x
     */
    public double getX() {
        return x;
    }

    /**
     * @param x the x to set
     */
    public void setX(double x) {
        this.x = x;
    }

    /**
     * @return the velocidade
     */
    public double getVelocidade() {
        return velocidade;
    }

    /**
     * @param velocidade the velocidade to set
     */
    public void setVelocidade(double velocidade) {
        this.velocidade = velocidade;
    }

    /**
     * @return the angulo
     */
    public double getAngulo() {
        return angulo;
    }

    /**
     * @param angulo the angulo to set
     */
    public void setAngulo(double angulo) {
        this.angulo = angulo;
    }

    /**
     * @return the sprite
     */
    public Sprite getSprite() {
        return sprite;
    }

    /**
     * @param sprite the sprite to set
     */
    public void setSprite(Sprite sprite) {
        this.sprite = sprite;
    }
    
    public Rectangle getBounds() {
        return new Rectangle((int) getX(), (int) getY(), 
                getSprite().getLarguraDosQuadros(), getSprite().getAlturaDosQuadros());
    }
    
    public boolean collidesWith(GameObject another) {
        return getBounds().intersects(another.getBounds());
    }
}
